package controller;

import java.util.List;
import org.hibernate.*;
import model.conexao.HibernateUtil;
import model.crudxml.Agenda;

public class AgendaCrudXML {

    public void salvar(Agenda agenda) {
        Session sessao = null;
        Transaction transacao = null;
        try {

            sessao = HibernateUtil.getSessionFactory().openSession();
            transacao = sessao.beginTransaction();
            sessao.save(agenda);
            transacao.commit();

        } catch (HibernateException e) {
            System.out.println("Atenção, ocorreu um problema ao tentar inserir \n "
                    + "um registro de agendamento: \n"
                    + e.getMessage());

        } finally {
            try {
                sessao.close();
            } catch (Throwable e) {
                System.out.println("Erro ao fechar operação de inserção, Mensagem: "
                        + e.getMessage());
            }
        }
    }

    public void atualizar(Agenda agenda) {

        Session sessao = null;
        Transaction transacao = null;

        try {
            sessao = HibernateUtil.getSessionFactory().openSession();
            transacao = sessao.beginTransaction();
            sessao.update(agenda);
            transacao.commit();

        } catch (HibernateException e) {
            System.out.println("Atenção, ocorreu um problema ao tentar atualizar um registro de agendamento: \n "
                    + e.getMessage());
        } finally {
            try {
                sessao.close();
            } catch (Throwable e) {
                System.out.println(
                        "Erro ao fechar operação de atualização. Mensagem:" + e.getMessage());
            }
        }
    }

    public void excluir(Agenda agenda) {
        Session sessao = null;
        Transaction transacao = null;

        try {
            sessao = HibernateUtil.getSessionFactory().openSession();
            transacao = sessao.beginTransaction();
            sessao.delete(agenda);
            transacao.commit();

        } catch (HibernateException e) {
            System.out.println("Atenção, ocorreu um problema ao tentar excluir um registro de agendamento: \n "
                    + e.getMessage());
        } finally {

            try {
                sessao.close();
            } catch (Throwable e) {
                System.out.println("Erro ao fechar operação de exclusão. Mensagem: "
                        + e.getMessage());
            }
        }
    }

    public List<Agenda> listar() {
        Session sessao = null;
        Transaction transacao = null;
        Query consulta = null;
        List<Agenda> resultado = null;

        try {
            sessao = HibernateUtil.getSessionFactory().openSession();
            transacao = sessao.beginTransaction();
            consulta = sessao.createQuery("from Agenda");
            resultado = consulta.list();
            transacao.commit();
            return resultado;
        } catch (HibernateException e) {

            System.out.println("Não foi possível selecionar registros de agendamentos. Erro: "
                    + e.getMessage());
            throw new HibernateException(e);
        } finally {
            try {
                sessao.close();
            } catch (Throwable e) {
                System.out.println("Erro ao fechar operação de pesquisa por registros. Mensagem: "
                        + e.getMessage());
            }
        }
    }

    public Agenda buscarAgenda(int valor) {
        Agenda agenda = null;
        Session sessao = null;
        Transaction transacao = null;
        Query consulta = null;

        try {
            sessao = HibernateUtil.getSessionFactory().openSession();
            transacao = sessao.beginTransaction();
            consulta = sessao.createQuery("from Agenda where codigo :parametro");
            consulta.setInteger("parametro", valor);
            agenda = (Agenda) consulta.uniqueResult();
            transacao.commit();
            return agenda;

        } catch (HibernateException e) {
            System.out.println("Não foi possível buscar agenda. Erro: "
                    + e.getMessage());
        } finally {

            try {
                sessao.close();
            } catch (Throwable e) {
                System.out.println("Erro ao fechar operação de buscar. Mensagem: "
                        + e.getMessage());
            }
        }
        return agenda;
    }
}
